#include <iostream>
#include <map>
#include <set>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;
//现在想实现的是,把单词出现的次数封装到一个容器map里面
//把单词出现的行号集合封装到一个容器map里面，实现的是可以自主查询
class Dirtionary{
public:
    Dirtionary(int a){
        _line.reserve(a);
    }
    void read(const string & filename){
        ifstream ifs(filename);
        int  _lindnumbers=0;
        string line;
        while(getline(ifs,line)){
            ++_lindnumbers;
            _line.push_back(line);
            string word;
            istringstream iss(line);
            while(iss>>word){
                //对应单词出现的频率就是这样写，因为operator[]的存在，
                //有word这个键就直接++值，没有这个键，就插入这个键，
                //同时会自动初始化int为0
                ++_wordcount[word];
                //对与存储行号的容器，set<int>还需要单独考虑
                _wordlindnumbers[word].insert(_lindnumbers);
            }
        }
    }
    //再去实现，每次输入一个单词，就会给我单词的出现次数，还有单词
    //出现的行的内容
    void qery(const string & word){
        //单词出现的次数
        cout<<word<<":"<<_wordcount[word]<<endl;
        //单词出现在每一行的行号和每一行的内容
        for(auto& ele:_wordlindnumbers[word]){
       cout<<ele<<" "<< _line[ele-1]<<endl;
        }
    }
private:
    //每一行的数据
    vector<string> _line;
    //单词对应的行号集合
    map<string,set<int>> _wordlindnumbers;
    //单词出现的频率
    map<string,int> _wordcount;

};
void test(){
    Dirtionary dir(10000);
    dir.read("The_Holy_Bible.txt");
    dir.qery("hello");
}
int main(int argc, char * argv[]){
    test();
    return 0;
}

